<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>


</body>
<script>
    // Promise对象 都有哪些方法
    // 实例方法  采用实例对象（new 创建出来的）来进行调用的方法
    // 1. then() 2. catch() 3. finally()(无论成功与失败都会执行的方法)
    const promise = new Promise((resolve, reject) => {
        // reject('失败') // pending ---> rejected
        resolve('成功') // pending ---> fulfilled

    })
    promise.then(
        // 成功的回调函数
        function (value) {
            console.log('执行成功的回调--->', value);
        },
        // 失败的回调函数(可选)
        function (reason) {
            console.log(reason);
        }
    )
    promise.finally(function () {
        console.log('finally');
    })
    // 静态方法 直接通过构造函数Promise来调用的方法
    // 1. Promise.all() 2. Promise.race() 3. Promise.resolve() 4. Promise.reject()
    // 返回一个fulfilled状态的Promise对象
    console.log(Promise.resolve([1, 2, 3]));
    // 返回一个rejected状态的Promise对象
    console.log(Promise.reject({ name: 'zs' }));
    // 接收一个Promise的数组，返回一个Promise对象
    // 当所有的Promise对象都成功时，返回一个fulfilled状态的Promise对象
    console.log('=======================Promise.all()===============================================')
    console.log(Promise.all([
        Promise.resolve(100),
        Promise.reject(2),
        Promise.resolve(3)
    ]));
    console.log('=======================Promise.all()===============================================')

    // 接收一个Promise的数组，返回一个Promise对象
    // race是赛跑的意思，当第一个Promsie对象成功或者失败时，返回第一个Promise对象  
    console.log('=======================Promise.race()===============================================')
    const p1 = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('成功')
        }, 10000)
    })
    const p2 = new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('失败')
        }, 2000)
    })
    console.log(Promise.race([p1, p2]));

    console.log('=======================Promise.race()===============================================')

    // 接收一个Promise的数组，返回一个Promise对象
    // allSettled是包含所有Promise对象的结果，返回一个fulfilled 状态的 Promise对象 Promise对象的结果数据是一个对象数组
    // 对象的结构：
    // {
    //     status: 'fulfilled' | 'rejected',
    //     value?: any,
    //     reason?: any
    // }
    console.log('=======================Promise.allSettled()===============================================')
    console.log(Promise.allSettled([
        Promise.resolve(100),
        Promise.reject(2),
        Promise.resolve(3)
    ]));
    console.log('=======================Promise.allSettled()===============================================')



    // 静态方法  Promise.any() 接收一个可迭代的Promise对象数组，返回一个Promise对象
    // any是任意的意思，当第一个Promise对象成功时，返回第一个Promise对象
    // 当所有的Promise对象失败时，返回一个失败的Promise对象
    console.log('=======================Promise.any()===============================================')

    const promise1 = Promise.reject(0);
    const promise2 = new Promise((resolve, reject) => setTimeout(() => resolve('quick'), 200));
    const promise3 = new Promise((resolve, reject) => setTimeout(resolve, 500, "slow"));

    const promises = [promise1, promise2, promise3];

    console.log(Promise.any(promises));

</script>

</html>